
************************************************************************;
** Output Contract Level Frequent Used Procedures and Selected Rates  **;
** For 2012 HEDIS HMO dataset                                         **;
************************************************************************;

options ls=100 nofmterr ;

libname raw '/data/Medicare_P01_2009/data/HEDIS/rawdata' ;
libname new '/data/Medicare_P01_2009/data/HEDIS/sasdata' ;
libname plan '/data/Medicare_P01_2009/data/HEDIS/plandata';


data a0; set new.hedis2012;

     if denom_flag=1;
     if state_code=' ' or state_code='00' or state_code>"53" or state_code in ("40","48") then delete;

     age=age+1; /* set to age at end of year */

     if age>=65;

     if plantypec='1.HMO/POS' then plantypec='HMO';
     if plantypec='2.PPO' then plantypec='PPO';

     if plantypec in ('HMO','PPO');

     length newagec $ 8;

     if age=65            then newagec='1.65';
     if age>65 and age<70 then newagec='2.66-69';
     if age>69 and age<75 then newagec='3.70-74';
     if age>74 and age<80 then newagec='4.75-79';
     if age>79 and age<85 then newagec='5.80-84';
     if age>84            then newagec='6.85+';

     *** RTI Race Code ***;

     length rti_racec $ 10;

          if rti_race_cd='1' then rti_racec='1.White';
     else if rti_race_cd='2' then rti_racec='2.Black';
     else if rti_race_cd='3' then rti_racec='3.Other';
     else if rti_race_cd='4' then rti_racec='4.Asian';
     else if rti_race_cd='5' then rti_racec='5.Hispanic';
     else if rti_race_cd='6' then rti_racec='6.Native';
     else rti_racec='0.Unknown';

     if age>65 and totmonth<12 then delete; 

     death_dt=bene_death_dt;
     if (bene_valid_death_dt_sw='V' or death_dt>0) then death1=1; else death1=0;

     deathyear=year(death_dt);
     deathmon =month(death_dt);

     if death1=1 and
       (deathyear=2012 or
       (deathyear=2013 and (deathmon>0 and deathmon<3)))
     then delete ;

     *-- cleaning BCS --*;

     if sex=1 or age>69 then bcs_d=.;
     if bcs_d =0 or bcs_d =. then bcs_n =.;

     *-- cleaning CDC ---*;

     if age>75 then do; cdc_d1=.; cdc_d4=.; cdc_d5=.; end;
     if cdc_d1=0 or cdc_d1=. then cdc_n1=.;
     if cdc_d4=0 or cdc_d4=. then cdc_n4=.;
     if cdc_d5=0 or cdc_d5=. then cdc_n5=.;


     *-- Clean up Gender Related Miscoding - very low occurance --**;

     if sex=1 then do; fsp_n_ah=.; fsp_n_vh=.;  fsp_n_mast=.; fsp_n_lump=.; end;  /** female only**/
     if sex=2 then fsp_n_pros=.;   /** male only**/

     *-- CAP measures  John and Bruce email 6-4-2010 --**;

       if fsp_n_cabg>3 then fsp_n_cabg=3;   
       if fsp_n_ptca>4 then fsp_n_ptca=4;   
       if fsp_n_cc>4   then fsp_n_cc=4;   
       
       if fsp_n_bwls=9 then fsp_n_bwls=.;   /** only 1 case, new measure added for 2010 **/

       array fps2 fsp_n_ce   fsp_n_thr   fsp_n_tkr   fsp_n_och   fsp_n_cch  
                  fsp_n_ah   fsp_n_vh    fsp_n_pros  fsp_n_mast  fsp_n_lump    fsp_n_bs   ;
       do over fps2; 
          if fps2>2 then fps2=2;  
       end;
 
       if ipu_t_acdi > 12 then ipu_t_acdi = 12 ;     * Total discharges set max 1 per month *;
       if ipu_t_acsdi > 12 then ipu_t_acsdi = 12 ;   * Surgery discharges *; 
       if ipu_t_acmedi > 12 then ipu_t_acmedi = 12 ; * Medical discharges *;

       if ipu_t_acdy > 365 then ipu_t_acdy = 365 ;  *Maximum possible in 12 months *;
       if ipu_t_acsdy > 365 then ipu_t_acsdy = 365 ;
       if ipu_t_acmedy > 365 then ipu_t_acmedy = 365 ;

       if amb_t_ov > 50 then amb_t_ov = 50;  * Set Total Outpatient Visits maximum 1 per week *;
       if amb_t_ed > 12 then amb_t_ed = 12;  * maximum 1 per month *;
 
     ********************************************************************;
     ** Rename All Variables and Will Keep Same Var Name for All Years **;
     ********************************************************************;

     cdc_d1 = cdc_d1;  label cdc_d1 = 'Denom for Diabetes: HbA1cTesting';
     cdc_d3 = cdc_d4;  label cdc_d3 = 'Denom for Diabetes: EyeExam';
     cdc_d4 = cdc_d5;  label cdc_d4 = 'Denom for Diabetes: LCL-C Screening';

     cdc_n1 = cdc_n1;  label cdc_n1 = 'Numer for Diabetes: HbA1cTesting';
     cdc_n3 = cdc_n4;  label cdc_n3 = 'Numer for Diabetes: EyeExam';
     cdc_n4 = cdc_n5;  label cdc_n4 = 'Numer for Diabetes: LCL-C Screening';


     %let fsp = fsp_n_cabg  fsp_n_ptca  fsp_n_cc   fsp_n_ce    fsp_n_thr   fsp_n_tkr  fsp_n_och   
                fsp_n_cch   fsp_n_ah    fsp_n_vh   fsp_n_pros  fsp_n_mast  fsp_n_lump 
                fsp_n_bs    fsp_n_bwls;

     %let uti = ipu_t_acdi  ipu_t_acsdi ipu_t_acmedi  ipu_t_acdy  ipu_t_acsdy ipu_t_acmedy
                amb_t_ov    amb_t_ed  ;

     %let rate = bcs_d bcs_n cmc_d cmc_n1 gso_d gso_n cdc_d1 cdc_n1 cdc_d4 cdc_n4 cdc_d5 cdc_n5;

     cons =1;

     proc freq data=a0 noprint;
          tables org_id / out=org_cnt;

  **-- Create a health plan info dataset --**;
       
  data org; set a0;

       keep org_id org_name plantypec;
       proc sort nodupkey; by org_id;
  
  **-- Output Contract Level Measures --**;

  data a; set a0;

     %let measures = fsp_n_cabg  fsp_n_ptca   fsp_n_cc      fsp_n_ce    fsp_n_thr  fsp_n_tkr  
                     fsp_n_och   fsp_n_cch    fsp_n_ah      fsp_n_vh    fsp_n_pros  fsp_n_mast fsp_n_lump fsp_n_bs   fsp_n_bwls
                     ipu_t_acdi  ipu_t_acsdi  ipu_t_acmedi  ipu_t_acdy  ipu_t_acsdy ipu_t_acmedy
                     amb_t_ov    amb_t_ed ;


       %macro test(grp,outmon,outdata,outplan,cnt);

             proc means data=a sum maxdec=0 nway noprint;
                  class &grp;
                  var m_months;
                  output out=&outmon sum=totmonth;

             proc means data=a n std sum maxdec=2 nway noprint;
                  class &grp;
                  var &measures ;
                  output out=&outdata n= std= sum= /autoname;

            data &outplan; merge &outmon &outdata &cnt; by &grp;

                 ***********************************************************************;
                 **  Note: Compute Contract Level Utilization Measures as             **; 
                 **        Num procedures/discharges/days/visits per 1000 member year **;
                 ***********************************************************************;

                 tot_n = count;

                 n_cabg = (fsp_n_cabg_sum/totmonth)*1000*12;  label n_cabg='CABG';
                 n_ptca = (fsp_n_ptca_sum/totmonth)*1000*12;  label n_ptca='PTCA';
                 n_cc   = (fsp_n_cc_sum/totmonth)*1000*12;    label n_cc  ='CardiacCathetherization';
                 n_ce   = (fsp_n_ce_sum/totmonth)*1000*12;    label n_ce  ='CardiacEnarterectomy';
                 n_thr  = (fsp_n_thr_sum/totmonth)*1000*12;   label n_thr ='TotalHipReplacement';
                 n_tkr  = (fsp_n_tkr_sum/totmonth)*1000*12;   label n_tkr ='TotalKneereplacement';
                 n_oc   = (fsp_n_och_sum/totmonth)*1000*12;   label n_oc  ='OpenCholecystectomy';
                 n_clc  = (fsp_n_cch_sum/totmonth)*1000*12;   label n_clc ='ClosedCholecstectomy';
                 n_ah   = (fsp_n_ah_sum/totmonth)*1000*12;    label n_ah  ='AbdominalHysterectomy';
                 n_vh   = (fsp_n_vh_sum/totmonth)*1000*12;    label n_vh  ='VaginalHysterectomy';
                 n_p    = (fsp_n_pros_sum/totmonth)*1000*12;  label n_p   ='Prostatectomy';
                 n_mast = (fsp_n_mast_sum/totmonth)*1000*12;  label n_mast='Masterctomy' ;
                 n_lump = (fsp_n_lump_sum/totmonth)*1000*12;  label n_lump='Lumpectomy' ;
                 n_bs   = (fsp_n_bs_sum/totmonth)*1000*12;    label n_bs  ='BackSurgery';
                 n_bwls = (fsp_n_bwls_sum/totmonth)*1000*12;  label n_bwls='BariatricWeightLossSurgery';


                iptotdis   = (ipu_t_acdi_sum/totmonth)*1000*12;    label iptotdis ='InpatTotalDischarges';
                ipsurdis   = (ipu_t_acsdi_sum/totmonth)*1000*12;   label ipsurdis ='InpatSurgeryDischarges';
                ipmeddis   = (ipu_t_acmedi_sum/totmonth)*1000*12;  label ipmeddis ='InpatMedicineDischarges';

                iptotdays  = (ipu_t_acdy_sum/totmonth)*1000*12;   label iptotdays ='InpatTotalDays';
                ipsurdays  = (ipu_t_acsdy_sum/totmonth)*1000*12;  label ipsurdays ='InpatSurgeryDays';
                ipmeddays  = (ipu_t_acmedy_sum/totmonth)*1000*12; label ipmeddays ='InpatMedicineDays';

                amb_opv = (amb_t_ov_sum/totmonth)*1000*12;     label amb_opv ='OutPatientVisits';
                amb_erv = (amb_t_ed_sum/totmonth)*1000*12;     label amb_erv ='EmergencyRoomVisits';


       %mend;

       %test(org_id,    org_mon,       org_dat,       org_util,       org_cnt);

       %macro rates(grp,outdat);

             proc means data=a(where=(bcs_d=1)) mean nway noprint;
                  class &grp;
                  var bcs_n; 
                  output out=planbcs mean=bcs;
 
             proc means data=a(where=(cmc_d=1)) mean nway noprint;
                  class &grp;
                  var cmc_n1;
                  output out=plancmc mean=cmc;

             proc means data=a(where=(cdc_d1=1)) mean nway noprint;
                  class &grp;
                  var cdc_n1;
                  output out=plancdc1 mean=cdc1;

             proc means data=a(where=(cdc_d4=1)) mean nway noprint;
                  class &grp;
                  var cdc_n4;
                  output out=plancdc3 mean=cdc3;

             proc means data=a(where=(cdc_d5=1)) mean nway noprint;
                  class &grp;
                  var cdc_n5;
                  output out=plancdc4 mean=cdc4;

            proc means data=a(where=(gso_d=1)) mean nway noprint;
                  class &grp;
                  var gso_n;
                  output out=plangso mean=gso;

       
          data &outdat; merge planbcs plancmc plancdc1 plancdc3 plancdc4 plangso; by &grp;

                 format bcs cmc cdc1 cdc3 cdc4 f8.4;

                 label bcs  ='Breast Cancer Screening 65-69';
                 label cmc  ='LDL-C Screening After AccuteCare';
                 label cdc1 ='Diabetes: HbA1cTesting';
                 label cdc3 ='Diabetes: EyeExam';
                 label cdc4 ='Diabetes: LCL-C Screening';
                 label gso  ='Glaucoma Screening';

            proc sort; by &grp;

    %mend;
 
    %rates(org_id,     org_rate);

   data orgid; merge org_util org_rate; by org_id;

        proc sort; by org_id;

   data plan.cntr2012(drop= _freq_ _type_ ); merge org orgid; by org_id;

         proc contents;
         proc freq; tables plantypec; 

endsas;

